#include <fmt/color.h>
#include <fmt/core.h>
#include <spdlog/sinks/basic_file_sink.h>
#include <spdlog/spdlog.h>

#include <Eigen/Dense>
#include <iomanip>

int main()
{
    // 1. fmt 的彩色输出例子
    fmt::print(fg(fmt::color::red), "这是红色文本\n");
    fmt::print(fg(fmt::color::green) | fmt::emphasis::bold, "这是粗体绿色文本\n");
    fmt::print(fg(fmt::color::blue) | bg(fmt::color::yellow), "这是蓝色文本黄色背景\n");
    fmt::print(fg(fmt::color::cyan) | fmt::emphasis::underline, "这是带下划线的青色文本\n");

    // 2. 原有的 Eigen 矩阵示例，添加彩色输出
    Eigen::Matrix3d m;
    m << 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9.9;

    fmt::print(fg(fmt::color::magenta), "彩色矩阵 3×3:\n");
    for (int i = 0; i < m.rows(); ++i)
    {
        for (int j = 0; j < m.cols(); ++j)
        {
            if (i == j)  // 对角线元素用不同颜色
                fmt::print(fg(fmt::color::yellow), "{:8.3f}", m(i, j));
            else
                fmt::print(fg(fmt::color::white), "{:8.3f}", m(i, j));
        }
        fmt::print("\n");
    }

    // 3. spdlog 的基本使用例子
    fmt::print(fg(fmt::color::green), "\n===== spdlog 使用示例 =====\n");

    // 基本控制台日志
    spdlog::info("这是一条 info 级别的日志");
    spdlog::warn("这是一条 warn 级别的日志");
    spdlog::error("这是一条 error 级别的日志");
    spdlog::critical("这是一条 critical 级别的日志");

    // 格式化日志
    int version = 1;
    std::string name = "spdlog demo";
    spdlog::info("程序名称: {}, 版本: {}", name, version);

    // 日志级别设置
    spdlog::set_level(spdlog::level::debug);     // 设置全局日志级别为 debug
    spdlog::debug("这是一条 debug 级别的日志");  // 现在可以显示
    spdlog::trace("这是一条 trace 级别的日志");  // 低于当前级别，不会显示

    // 尝试创建文件日志（注意：实际运行时可能需要有写权限的路径）
    try
    {
        auto file_logger = spdlog::basic_logger_mt("file_logger", "logs/demo.log");
        file_logger->info("这条日志会被写入到文件中");
        spdlog::info("文件日志器已创建");
    }
    catch (const spdlog::spdlog_ex &ex)
    {
        spdlog::error("无法创建文件日志器: {}", ex.what());
    }

    return 0;
}